package course.p3_arraysSort.exa10_twoDArraySort;

import course.p3_arraysSort.SortUtil;

/**
 * 针对二位数组的某一项对二维数组进行排序
 */
public class TwoDArraySort {

    public static void main(String[] args) {
        //定义一个二维数组并赋值
        int[][] in = {{4, 50}, {8, 50}, {6, 100}, {8, 50}};
        in = sort(in,0);
        for(int i=0;i<in.length;i++){
            for(int m=0;m<in[i].length;m++){
                System.out.print(in[i][m]+" ");
            }
            System.out.println();
        }
    }

    /**
     * 针对二维数组的其中一维进行排序
     * @param in 二维数组
     * @param n 维度
     * @return 排序后的二维数组
     */
    public static int[][] sort(int[][] in,int n) {
        //用于降维
        Integer[] a = new Integer[in.length];
        //还原时需要用到的中转数组
        int[][] b=new int[1][1];
        /*首先是降维，将要针对的那个维度降维成一维数组
        这里是将数组thing中的50，60，100，70变为一维数组赋给数组a
        */
        for(int i=0;i<in.length;i++){
            a[i]=in[i][n];
        }
        //SortUtil的排序方法
        SortUtil.sort(a,SortUtil.INSERT);
       /*下面的操作是还原为二维数组的排序
            其主要思想是以a为基准对thing中的元素进行排序，
            例如a[0]=50,就在thing中找到thing[m][1]=50的,
            将thing[m]放到第一位，以此类推
        */
        for (int j=0;j<in.length;j++) {
            for (int m=0;m<in.length;m++){
                if(a[j]==in[m][n]){
                    in[m][n]=-in[m][n];//解决重复问题
                    b[0]=in[j];//由于这里还原时是地址赋值
                    //为了避免地址覆盖所以需要一个中间量存储被换数组的地址
                    in[j]=in[m];
                    in[m]=b[0];
                    break;
                }
            }
        }
        for(int j=0;j<in.length;j++) {
            in[j][n]=-in[j][n];
        }
        return in;
    }




}
